﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Dominio
{
    public class CommandBuzon : ICommand
    {
        public enum Metodos { EliminarMensaje, AplicarRegla, EliminarCarpeta, CrearCarpeta };

        private Buzon buzon;

        internal Buzon Buzon
        {
            get { return buzon; }
            set { buzon = value; }
        }

        private List<Object> parametros;

        internal List<Object> Parametros
        {
            get { return parametros; }
            set { parametros = value; }
        }

        private Metodos metodo;

        internal Metodos Metodo
        {
            get { return metodo; }
            set { metodo = value; }
        }

        //En parametros irian los parametros respectivos para el metodo ingresado como parametro
        //Si parametros no corresponden con el metodo tirara un Exception
        /// <summary>
        /// 
        /// </summary>
        /// <param name="buzon"></param>
        /// <param name="parametros"> Metodo.CrearCarpeta parametro1 = CarpetaHija</param>
        /// <param name="metodo"></param>
        public CommandBuzon(Buzon buzon, List<Object> parametros, Metodos metodo)
        {
            Parametros = parametros;
            Metodo = metodo;
            this.Buzon = buzon;
        }

        public void Execute()
        {
            switch (Metodo)
            {
                case Metodos.AplicarRegla:
                    buzon.AplicarRegla(parametros);
                    break;
                case Metodos.CrearCarpeta:
                    buzon.CrearCarpeta((Carpeta)Parametros.ElementAt(0));
                    break;
                case Metodos.EliminarCarpeta:
                    buzon.EliminarCarpeta((Carpeta)Parametros.ElementAt(0));
                    break;
                case Metodos.EliminarMensaje:
                    buzon.EliminarMensaje((Mensaje)Parametros.ElementAt(0));
                    break;
            }
        }

        //TODO modificar
        public void UnExecute()
        {
            switch (Metodo)
            {
                case Metodos.AplicarRegla:
                    buzon.AplicarRegla(parametros);
                    break;
                case Metodos.CrearCarpeta:
                    buzon.CrearCarpeta((Carpeta)Parametros.ElementAt(0));
                    break;
                case Metodos.EliminarCarpeta:
                    buzon.EliminarCarpeta((Carpeta)Parametros.ElementAt(0));
                    break;
                case Metodos.EliminarMensaje:
                    buzon.EliminarMensaje((Mensaje)Parametros.ElementAt(0));
                    break;
            }
        }
    }
}
